비동기 프로그래밍

AI
qwen-3-235b-a22b
작성자
익명
작성일
2025.07.31
조회수
28
버전
v1

비동기 프로그래밍

개요

JavaScript는 단일 스레드 기반의 언어로, 동기적 코드 실행이 기본이지만 네트워크 요청, 파일 시스템 작업, 사용자 입력 처리와 같은 비차단(non-blocking) 작업을 위해 비동기 프로그래밍 모델을 채택하고 있습니다. 이 문서에서는 JavaScript의 비동기 처리 방식의 역사적 발전과 최신 표준을 중심으로 설명하며, 이벤트 루프, 콜백 함수, 프로미스, async/await의 개념과 활용 방법을 다룹니다.

콜백 함수 (Callback Functions)

개념

콜백 함수는 비동기 작업 완료 후 실행되는 함수로, JavaScript 초기부터 사용된 전통적인 방법입니다. 예시:

function fetchData(callback) {
  setTimeout(() => {
    callback('데이터 수신 완료');
  }, 1000);
}

fetchData((result) => {
  console.log(result); // "데이터 수신 완료" (1초 후)
});

한계

  • 콜백 지옥(Callback Hell): 중첩된 콜백으로 인해 코드 가독성이 저하되는 문제
  • 에러 처리 복잡성: 각 콜백에서 별도의 에러 처리 필요

프로미스 (Promise)

상태

프로미스는 비동기 작업의 최종 완료 또는 실패를 나타내는 객체로, 다음 세 가지 상태를 가집니다: | 상태 | 설명 | |------|------| | pending | 대기 상태 (초기 상태) | | fulfilled | 성공적으로 완료됨 | | rejected | 실패 상태 |

then과 catch

fetchData()
  .then((result) => {
    console.log('성공:', result);
  })
  .catch((error) => {
    console.error('실패:', error);
  });

정적 메서드

메서드 설명
[Promise.all](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%8B%A4%EC%8B%9C%EA%B0%84%20%EA%B0%9C%EB%B0%9C/Promise.all)() 모든 프로미스가 성공할 때까지 대기
[Promise.race](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%8B%A4%EC%8B%9C%EA%B0%84%20%EA%B0%9C%EB%B0%9C/Promise.race)() 가장 먼저 완료된 프로미스 결과 반환
[Promise.allSettled](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%8B%A4%EC%8B%9C%EA%B0%84%20%EA%B0%9C%EB%B0%9C/Promise.allSettled)() 모든 프로미스의 결과 반환 (성공/실패 관계 없이)
[Promise.any](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%8B%A4%EC%8B%9C%EA%B0%84%20%EA%B0%9C%EB%B0%9C/Promise.any)() 가장 먼저 성공한 프로미스 결과 반환

async/await

기본 문법

async 함수는 암시적으로 프로미스를 반환하며, await 키워드를 사용해 비동기 코드를 동기적으로 표현할 수 있습니다:

async function getData() {
  try {
    const result = await fetchData();
    console.log('결과:', result);
  } catch (error) {
    console.error('에러:', error);
  }
}

에러 처리

  • [try/catch](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%8B%A4%EC%8B%9C%EA%B0%84%20%EA%B0%9C%EB%B0%9C/try%2Fcatch) 구문으로 명확한 에러 핸들링 가능
  • unhandledrejection 이벤트 리스너로 전역 에러 처리

내부 동작

async/await은 프로미스 기반의 문법적 설탕(syntactic sugar)으로, Babel과 같은 트랜스파일러는 이를 프로미스 체인으로 변환합니다.

고급 개념

이벤트 루프와 마이크로태스크

  • 마이크로태스크 큐: 프로미스 콜백은 이벤트 루프의 해당 단계에서 우선 처리됨
  • 우선순위: 마이크로태스크 > 타이머 > I/O 이벤트

동시성 모델

  • 이벤트 기반 아키텍처: 이벤트 발생 시 등록된 핸들러 실행
  • Web Workers: CPU 집약적 작업을 위한 별도 스레드 (브라우저 환경)

참고 자료

  1. MDN Docs - JavaScript 비동기 프로그래밍
  2. ECMAScript® 2021 Language Specification
  3. 자바스크립트 비동기 처리 완벽 가이드 (한글)

이 문서는 JavaScript의 비동기 처리 방식을 체계적으로 이해하고 현대 웹 개발에서의 활용 방법을 설명하기 위해 제작되었습니다. 추가적인 학습을 위해 MDN 문서와 공식 스펙을 참조하시기 바랍니다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(qwen-3-235b-a22b)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?